/* eslint-disable no-unused-vars */
//引入接口
import { reqGoodsInfo, reqAddOrUpdateShopCart } from "@/api";
//引入utils中暴露的uuid--->生成随机的字符串(只能有一个，不能在变了)
import { getUUID } from '@/utils/uuid_token';
//state：仓库存储数据的地方
const state = {
    //state中的默认数据，服务器返回对象，默认数据就是对象，返回数组，起始值就是数组
    //初始值根据接口返回值的类型
    goodInfo: {},
    //获取uuid生成的随机值,游客的临时身份，函数执行100次，最终返回的值永远是一个
    uuid_token: getUUID()
};
//mutations：修改state的唯一手段,只要mutations才能修改state
const mutations = {
    GETGOODINFO(state, goodInfo) {
        state.goodInfo = goodInfo
    }
};
//action：处理action。可以书写自己的业务逻辑，也可以处理异步
const actions = {
    //通过API里面的接口函数调用，向服务器发请求，获取服务器的数据
    // await即等待，用于等待一个Promise对象。它只能在异步函数 async function中使用，否则会报错
    // 它的返回值不是Promise对象而是Promise对象处理之后的结果
    //获取产品信息的详情,dispatch派发时传入参数
    async getGoodInfo({ commit }, skuid) {
        let result = await reqGoodsInfo(skuid);
        if (result.code == 200) {
            commit("GETGOODINFO", result.data)
        }
    },
    //将产品添加到购物车中
    //因为有async必然返回一个promise，Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。
    async addOrUpdateShopCart({ commit }, { skuId, skuNum }) {
        //加入购物车返回的结构
        //加入购物车以后（发请求），前台将参数带给服务器，
        // 服务器写入数据成功，并没有返回其他的数据，只是返回code=200，代表这次操作成功
        // 因为服务器没有返回其余数据，因此咱们不需要三连环存储数据
        let result = await reqAddOrUpdateShopCart(skuId, skuNum)
        //代表服务器加入购物车成功
        if (result.code == 200) {
            return 'ok' //Promise下的PromiseResult值
        } else { //没有加入成功，Promise.reject返回一个带有拒绝原因的Promise对象，‘faile’原因
            return Promise.reject(new Error('faile'));
        }

    }
};
//getters：理解为计算属性，用于简化仓库数据，让组件获取仓库的数据更加方便
const getters = {
    categoryView(state) {
        //路径导航简化的数据
        //比如：state.goodInfo初始状态空对象，空对象的categoryView属性值undefined，至少为一个空对象
        return state.goodInfo.categoryView || {};
    },
    //简化产品信息的数据
    skuInfo(state) {
        return state.goodInfo.skuInfo || {}
    },
    //产品售卖属性的简化
    spuSaleAttrList(state) {
        return state.goodInfo.spuSaleAttrList || []
    }
};
export default {  //对外暴露，方便其他组件调用
    state,
    mutations,
    actions,
    getters,
};